package com.waitingresult.reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * All right reserved,Designed By WangShuai
 * <p>
 *
 * @author : WangShuai
 * @version : V1.0
 * @ClassName : Demo1
 * @Description :
 * @date : 2021/9/30 13:50
 */
public class Demo1 {
    public static void main(String[] args) throws Exception {

        //通过反射获取对象
        Class<?> cat = Class.forName("com.waitingresult.reflection.reflection.Cat");

        //通过Class对象获取 默认的空参构造器
        Constructor<?> constructor = cat.getConstructor();
        // 获取所有的构造器， 包含private 的构造
        Constructor<?>[] declaredConstructors = cat.getDeclaredConstructors();
        for (Constructor<?> declaredConstructor : declaredConstructors) {
            System.err.println(declaredConstructor);
        }
        //通过构造器创建对象
        // 暴力获取非public的构造
        Constructor<?> declaredConstructor = cat.getDeclaredConstructor(int.class);
        //跳过访问安全检查
        declaredConstructor.setAccessible(true);
        Cat o1 = (Cat) declaredConstructor.newInstance(1);
        o1.hi();

        //成员变量数组
        Field[] fields = cat.getFields();
        Field[] declaredFields = cat.getDeclaredFields();
        System.err.println("finds...start");
        for (Field field : declaredFields) {
            if("age".equals(field.getName())){
                System.err.println("--- if age ==true");
                field.setAccessible(true);
                field.set(cat,1);
            }
            System.err.println(field);
        }
        System.err.println("finds...end");

        // 通过反射获取的对象, new 一个对象实例
        Object o = cat.newInstance();
        //获取对象的方法
        Method hi = cat.getMethod("hi");
        //通过对象的方法,调用这个 反射对象
        hi.invoke(o);

        System.err.println("---methods----------------------");
        Method[] declaredMethods = cat.getDeclaredMethods();
        for (Method m : declaredMethods) {
            System.err.println(m.getName());
        }
    }
}
